﻿''' <summary>
''' Clase encargada de generar las ligas del campeonato
''' </summary>
''' <author>Juan David Cabezuelo, Arturo Sirvent, Fermín Martínez, Eugenio Cañete y Pablo Vicedo</author>
''' 
Public Class GenerarLiga

    Dim equipos As List(Of String)
    Dim IDTorneo As Integer
    Dim totalJornadas As Integer
    Dim partidosJornada As Integer
    Dim totalPartidos As Integer
    Dim totalEquipos As Integer
    Dim numeroRondas As Integer
    Dim bd As BaseDatos
    Dim MaxIdPartidos As Integer

    ''' <summary>
    ''' Constructor para inicializar las variables
    ''' </summary>
    ''' <param name="equipos"></param>
    ''' <param name="MaxIdPartidos"></param>
    ''' <param name="Nrondas"></param>
    ''' <param name="IdTorneo"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal equipos As List(Of String), ByVal MaxIdPartidos As Integer, ByVal Nrondas As Integer, ByVal IdTorneo As Integer)
        'Inicializamos el valor del id máximo de partidos y de rondas
        Me.MaxIdPartidos = MaxIdPartidos
        Me.numeroRondas = Nrondas
        Me.IDTorneo = IdTorneo
        'MsgBox(Me.IDTorneo)
        'comprobamos que el array contiene elementos pares, si no es así 
        'asignamos un elemento con id=0 que actuará como equipo fantasma.
        If equipos.Count Mod 2 <> 0 Then
            equipos.Add("0")
            Me.equipos = equipos
        Else
            Me.equipos = equipos
        End If

        'inicializamos la varible bd
        bd = New BaseDatos

        'Inicializamos los datos que nos harán falta para nuestros algoritmos
        totalEquipos = equipos.Count
        totalJornadas = totalEquipos - 1
        partidosJornada = CInt(totalEquipos / 2)
        totalPartidos = totalJornadas * partidosJornada
    End Sub

    ''' <summary>
    '''Función que se encarga de generar las ligas
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Generardor()
        InfoGenerador()

        'Lista que contiene los partidos generados para una sola vuelta
        Dim listaPartidos As List(Of String) = New List(Of String)

        'Variable que guarda los partidos de vuelta
        'guardaremos en orden inverso que la lista de partidos normal
        Dim listaPartidosVuelta As List(Of String) = New List(Of String)

        'variable para hacer las rotaciones
        Dim aux As List(Of String) = equipos

        For i As Integer = 0 To totalJornadas - 1 Step 1
            'Generamos combinaciones y añadimos a la lista de partidos
            For j As Integer = 0 To CInt(totalEquipos / 2) - 1 Step 1
                'listaPartidos.Add(aux(j))
                'listaPartidos.Add(aux(aux.Count - j - 1))
                'listaPartidosVuelta.Add(aux(aux.Count - j - 1))
                'listaPartidosVuelta.Add(aux(j))
                listaPartidos.Add(aux(j) & "-" & aux(aux.Count - j - 1))
                listaPartidosVuelta.Add(aux(aux.Count - j - 1) & "-" & aux(j))
            Next

            'Rotamos y asignamos
            Dim auxModificado = Rotar(aux)
            aux = auxModificado
        Next

        If numeroRondas = 1 Then
            InsertarDatosPartidos(listaPartidos)
        ElseIf numeroRondas = 2 Then
            InsertarDatosPartidos(listaPartidos)
            InsertarDatosPartidos(listaPartidosVuelta)
        End If

    End Sub

    ''' <summary>
    ''' Función que se encarga de insertar los partidos en la base de datos
    ''' </summary>
    ''' <param name="lista"></param>
    ''' <remarks></remarks>
    Public Sub InsertarDatosPartidos(ByVal lista As List(Of String))
        Dim datos() As String
        Dim equipoLocal As Integer
        Dim equipoVisitante As Integer
        For Each dato As String In lista
            datos = Split(dato, "-")
            equipoLocal = CInt(datos(0))
            equipoVisitante = CInt(datos(1))
            MaxIdPartidos += 1
            Debug.WriteLine("Insert into Partidos(Id, IdTorneo, IdEquipo, Set1, Set2, Set3) values(" _
            & MaxIdPartidos & "," & IDTorneo & "," & equipoLocal & ",0, 0, 0)")
            bd.InsertarModificarBorrar("Insert into Partidos(Id, IdTorneo, IdEquipo, Set1, Set2, Set3) values(" _
            & MaxIdPartidos & "," & IDTorneo & "," & equipoLocal & ",0, 0, 0)")
            Debug.WriteLine("Insert into Partidos(Id, IdTorneo, IdEquipo, Set1, Set2, Set3) values(" _
            & MaxIdPartidos & "," & IDTorneo & "," & equipoVisitante & ",0, 0, 0)")
            bd.InsertarModificarBorrar("Insert into Partidos(Id, IdTorneo, IdEquipo, Set1, Set2, Set3) values(" _
            & MaxIdPartidos & "," & IDTorneo & "," & equipoVisitante & ",0, 0, 0)")
        Next
    End Sub


    ''' <summary>
    ''' Función quese encarga de rotar las listas para que los equipos roten entre jornadas y
    ''' al final devuelvo la lista rotada para volver a generar los partidos
    ''' de esa jornada
    ''' </summary>
    ''' <param name="lista"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Rotar(ByVal lista As List(Of String)) As List(Of String)
        Dim aux As List(Of String) = New List(Of String)
        aux.Add(lista(0))
        aux.Add(lista(lista.Count - 1))

        For i As Integer = 1 To lista.Count - 2 Step 1
            aux.Add(lista(i))
        Next

        Return aux
    End Function

    ''' <summary>
    ''' Función que se encarga de mostrar lainformación
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub InfoGenerador()
        'Mostramos información
        Debug.WriteLine("IDTorneo: " & IDTorneo & " Número de rondas: " & numeroRondas & vbCrLf & "Total equipos: " & totalEquipos & vbCrLf _
                        & "Total Jornadas: " & totalJornadas & vbCrLf & "Total partidos por Jornada: " & partidosJornada & vbCrLf _
                        & "Total partidos jugados: " & totalPartidos)
    End Sub

    Public Sub Mostrar(ByVal a As List(Of String))
        For Each dato As String In a
            Debug.Write(dato)
        Next
        Debug.WriteLine("")
    End Sub

End Class
